package com.zjsru.oneDay;

import java.util.Arrays;

/***
 * 推多米诺
 *
 * dominoes[i] = 'L'，表示第 i 张多米诺骨牌被推向左侧，
 * dominoes[i] = 'R'，表示第 i 张多米诺骨牌被推向右侧，
 * dominoes[i] = '.'，表示没有推动第 i 张多米诺骨牌。
 *
 *
 * 输入：dominoes = "RR.L"
 * 输出："RR.L"
 * 解释：第一张多米诺骨牌没有给第二张施加额外的力。
 *
 * 输入：dominoes = ".L.R...LR..L.."
 * 输出："LL.RR.LLRRLL.."
 *
 */
public class pushDominoes {
    public String pushDominoes(String dominoes) {
        char[] s = dominoes.toCharArray();
        int n = s.length;
        int i = 0;
        char Left = 'L';
        while (i < n) {
            int j = i;
            while (j < n && s[j] == '.') { // 找到一段连续的没有被推动的骨牌
                j++;
            }
            char right = j < n ? s[j] : 'R';
            if (Left == right) {// 方向相同，那么这些竖立骨牌也会倒向同一方向
                while (i < j) {
                    s[i++] = right;
                }
            } else if (Left == 'R' && right == 'L') {// 方向相对，那么就从两侧向中间倒
                int k = j - 1;
                while (i < k) {
                    s[i++] = 'R';
                    s[k--] = 'L';
                }
            }
            Left = right;
            i = j + 1;
        }
        return new String(s);
    }


    public String pushDominoes2(String dominoes) {
        int n = dominoes.length();
        char[] cd = dominoes.toCharArray(), ans = new char[n];
        Arrays.fill(ans, '.');
        char lastc = '.';
        int st = -1;
        for (int i = 0; i < n; i++) {
            if (cd[i] == '.') {
                continue;
            } else if (cd[i] == 'L') {
                if (lastc == 'R') {
                    for (int l = st + 1, r = i - 1; l < r; l++, r--) {
                        ans[l] = 'R';
                        ans[r] = 'L';
                    }
                    lastc = 'L';
                    ans[i] = 'L';
                    st = i;
                } else {
                    while (st < i) {
                        ans[++st] = 'L';
                    }
                    lastc = 'L';
                }
            } else {
                if (lastc == 'R') {
                    while (st < i) {
                        ans[++st] = 'R';
                    }
                }
                ans[i] = 'R';
                lastc = 'R';
                st = i;
            }
        }
        if (lastc == 'R') {
            while (st < n - 1) {
                ans[++st] = 'R';
            }
        }
        return new String(ans);
    }

    /**
     * 推送dominoes3
     *
     * @param dominoes 多米诺骨牌
     * @return {@link String}
     */
    public String pushDominoes3(String dominoes) {
        char[] chars = ("L" + dominoes + "R").toCharArray();
        // 上一个 L 或 R 的位置
        int pre = 0;
        for (int i = 1; i < chars.length; i++) {
            if (chars[i] == '.') {
                continue;
            }
            if (chars[i] == chars[pre]) {
                //LL/RR
                Arrays.fill(chars, pre + 1, i, chars[i]);
            } else if (chars[i] == 'L') {
                //R..L
                Arrays.fill(chars, pre + 1, (pre + i + 1) / 2, 'R'); // 前一半变 R
                Arrays.fill(chars, (pre + i) / 2 + 1, i, 'L'); // 后一半变 L
            }
            //不变位置
            pre = i;
        }
        return new String(chars, 1, chars.length - 2);
    }

    public static void main(String[] args) {
        pushDominoes pushDominoes = new pushDominoes();
        String dominnoes = "RR.L";
        System.out.println(pushDominoes.pushDominoes3(dominnoes));
    }
}
